using UnityEngine;

namespace HEFramework
{
    /// <summary>
    ///
    /// 3D音效播放组件
    /// 
    /// ----------------------------------------
    /// 作者 hep
    /// 创建时间：2023-12-19 16:01:43
    /// ----------------------------------------
    /// </summary>
    public class Effect3DAudioSource : AudioSourceBase
    {
        private Transform follow;

        protected override void InAwake()
        {
            audioSource.spatialBlend = 1;
            audioSource.loop = false;
        }

        protected override void InUpdate()
        {
            if (follow != null)
            {
                audioSource.transform.position = follow.transform.position;
            }
            else
            {
                audioSource.transform.position = Vector3.zero;
            }
        }

        /// <summary>
        /// 设置跟随对象
        /// </summary>
        /// <param name="_form"></param>
        /// <returns></returns>
        public Effect3DAudioSource SetFollow(Transform _form)
        {
            follow = _form;
            return this;
        }

        /// <summary>
        /// 设置空间混合【调整这个参数可以控制声音在2D和3D空间之间的混合。将其设置为1可以使声音完全在3D空间中播放，增强3D音效的立体感】
        /// </summary>
        /// <param name="_value"></param>
        /// <returns></returns>
        public Effect3DAudioSource SetSpatialBlend(float _value)
        {
            if (_value < 0)
            {
                _value = 0;
            }

            if (_value > 1)
            {
                _value = 1;
            }

            audioSource.spatialBlend = _value;
            return this;
        }

        /// <summary>
        /// 设置多普勒效应【启用多普勒效应可以模拟声源在移动过程中的音调变化。调整这个参数可以控制多普勒效应的强度，使声音更加真实】
        /// </summary>
        /// <param name="_value"></param>
        /// <returns></returns>
        public Effect3DAudioSource SetDopplerLevel(float _value)
        {
            if (_value < 0)
            {
                _value = 0;
            }

            if (_value > 5)
            {
                _value = 5;
            }

            audioSource.dopplerLevel = _value;
            return this;
        }

        /// <summary>
        /// 设置扩散【使用这个参数可以调整声音的扩散范围。增大扩散值可以使声音更广泛地分布在3D空间中，增加真实感】
        /// </summary>
        /// <param name="_mode"></param>
        /// <returns></returns>
        public Effect3DAudioSource SetSpread(float _value)
        {
            if (_value < 0)
            {
                _value = 0;
            }

            if (_value > 360)
            {
                _value = 360;
            }

            audioSource.spread = _value;
            return this;
        }

        /// <summary>
        /// 设置音量衰减模式【使用这个参数可以模拟声音随距离的减弱。选择合适的衰减曲线并调整最小和最大距离，使声音的远近感更真实】
        /// </summary>
        /// <param name="_mode"></param>
        /// <returns></returns>
        public Effect3DAudioSource SetVolumeRollOff(AudioRolloffMode _mode)
        {
            audioSource.rolloffMode = _mode;
            return this;
        }

        /// <summary>
        /// 设置距离
        /// </summary>
        /// <param name="_min">【设置声音的最小距离，超过这个距离后声音将开始衰减。根据实际情况设置最小距离，以使声音在较远的距离上听起来更加真实】</param>
        /// <param name="_max">【设置声音的最大距离，超过这个距离后声音将不再衰减。根据实际情况设置最大距离，以使声音在适当的距离上听起来更加真实】</param>
        /// <returns></returns>
        public Effect3DAudioSource SetDistance(float _min, float _max)
        {
            if (_min < 0)
            {
                _min = 0;
            }

            if (_max < 0)
            {
                _max = 0;
            }

            if (_min > _max)
            {
                _min = _max;
            }

            audioSource.minDistance = _min;
            audioSource.maxDistance = _max;
            return this;
        }


        /// <summary>
        /// 设置空间化【启用这个选项可以使声音根据3D位置进行空间化处理，增强3D音效的真实感】
        /// </summary>
        /// <param name="_value"></param>
        /// <returns></returns>
        public Effect3DAudioSource SetSpatialize(bool _value)
        {
            audioSource.spatialize = _value;
            return this;
        }
    }
}